using System.Collections.Generic;
using SIP.PN.DAO.Interfaces;
using SIP.PN.Filtros.Interfaces;
using SIP.PN.Modelo.Entidades;
using SIP.PN.Servicios.Interfaces;
using SIP.PN.Servicios.Interfaces.DTO;

namespace SIP.PN.Servicios
{
    public class ServicioAplicacion : Servicio, IServicioAplicacion
    {
        #region Daos

        private IDaoEspecialidad daoEspecialidad;
        public IDaoEspecialidad DaoEspecialidad
        {
            get { return daoEspecialidad; }
            set { daoEspecialidad = value; }
        }

        private IDaoTipoDeDocumento daoTipoDeDocumento;
        public IDaoTipoDeDocumento DaoTipoDeDocumento
        {
            get { return daoTipoDeDocumento; }
            set { daoTipoDeDocumento = value; }
        }

        private IDaoNivelEspecialidad daoNivelEspecialidad;
        public IDaoNivelEspecialidad DaoNivelEspecialidad
        {
            get { return daoNivelEspecialidad; }
            set { daoNivelEspecialidad = value; }
        }

        private IDaoProyectoEstado daoProyectoEstado;
        public IDaoProyectoEstado DaoProyectoEstado
        {
            get { return daoProyectoEstado; }
            set { daoProyectoEstado = value; }
        }

        private IDaoProyectoTareaEstado daoProyectoTareaEstado;
        public IDaoProyectoTareaEstado DaoProyectoTareaEstado
        {
            get { return daoProyectoTareaEstado; }
            set { daoProyectoTareaEstado = value; }
        }

        private IDaoTaller daoTaller;
        public IDaoTaller DaoTaller
        {
            get { return daoTaller; }
            set { daoTaller = value; }
        }
        
        #endregion

        #region Especialidad

        public EspecialidadDTO ObtenerEspecialidad(string codigo)
        {
            return ConvertToDTO(DaoEspecialidad.Obtener(codigo));
        }

        public IList<EspecialidadDTO> ListarEspecialidad(string nombre)
        {
            IList<EspecialidadDTO> r = new List<EspecialidadDTO>();
            IFiltroEspecialidad filtro = ObtenerFiltro<IFiltroEspecialidad>();
            filtro.Nombre = nombre;
            foreach (Especialidad item in DaoEspecialidad.Listar(filtro))
            {
                r.Add(ConvertToDTO(item));
            }
            return r;
        }

        #endregion

        #region Tipo de Documento

        public TipoDeDocumentoDTO ObtenerTipoDeDocumento(string codigo)
        {
            return ConvertToDTO(DaoTipoDeDocumento.Obtener(codigo));
        }

        public IList<TipoDeDocumentoDTO> ListarTipoDeDocumento(string nombre)
        {
            IList<TipoDeDocumentoDTO> r = new List<TipoDeDocumentoDTO>();
            IFiltroTipoDeDocumento filtro = ObtenerFiltro<IFiltroTipoDeDocumento>();
            filtro.Nombre = nombre;
            foreach (TipoDeDocumento item in DaoTipoDeDocumento.Listar(filtro))
            {
                r.Add(ConvertToDTO(item));
            }
            return r;
        }

        #endregion

        #region Nivel Especialidad

        public NivelEspecialidadDTO ObtenerNivelEspecialidad(string codigo)
        {
            return ConvertToDTO(DaoNivelEspecialidad.Obtener(codigo));
        }

        public IList<NivelEspecialidadDTO> ListarNivelEspecialidad(string nombre)
        {
            IList<NivelEspecialidadDTO> r = new List<NivelEspecialidadDTO>();
            IFiltroNivelEspecialidad filtro = ObtenerFiltro<IFiltroNivelEspecialidad>();
            filtro.Nombre = nombre;

            foreach (NivelEspecialidad item in DaoNivelEspecialidad.Listar(filtro))
            {
                r.Add(ConvertToDTO(item));
            }
            return r;
        }

        #endregion

        #region Proyecto Estado

        public ProyectoEstadoDTO ObtenerProyectoEstado(string codigo)
        {
            return ConvertToDTO(DaoProyectoEstado.Obtener(codigo));
        }

        public IList<ProyectoEstadoDTO> ListarProyectoEstado(string nombre)
        {
            IList<ProyectoEstadoDTO> r = new List<ProyectoEstadoDTO>();
            IFiltroProyectoEstado filtro = ObtenerFiltro<IFiltroProyectoEstado>();
            filtro.Nombre = nombre;
            foreach (ProyectoEstado item in DaoProyectoEstado.Listar(filtro))
            {
                r.Add(ConvertToDTO(item));
            }
            return r;
        }

        #endregion

        #region Proyecto Tarea Estado

        public ProyectoTareaEstadoDTO ObtenerProyectoTareaEstado(string codigo)
        {
            return ConvertToDTO(DaoProyectoTareaEstado.Obtener(codigo));
        }

        public IList<ProyectoTareaEstadoDTO> ListarProyectoTareaEstado(string nombre)
        {
            IList<ProyectoTareaEstadoDTO> r = new List<ProyectoTareaEstadoDTO>();
            IFiltroProyectoTareaEstado filtro = ObtenerFiltro<IFiltroProyectoTareaEstado>();
            filtro.Nombre = nombre;
            foreach (ProyectoTareaEstado item in DaoProyectoTareaEstado.Listar(filtro))
            {
                r.Add(ConvertToDTO(item));
            }
            return r;
        }

        #endregion

        #region Taller

        public TallerDTO ObtenerTaller(string codigo)
        {
            return ConvertToDTO(DaoTaller.Obtener(codigo));
        }

        public IList<TallerDTO> ListarTaller(string especialidad, string nombre)
        {
            IList<TallerDTO> r = new List<TallerDTO>();
            IFiltroTaller filtro = ObtenerFiltro<IFiltroTaller>();
            filtro.Nombre = nombre;
            if (!string.IsNullOrEmpty(especialidad))
            {
                Especialidad e = new Especialidad();
                e.Codigo = especialidad;
                filtro.Especialidad = e;
            }
            foreach (Taller item in DaoTaller.Listar(filtro))
            {
                r.Add(ConvertToDTO(item));
            }
            return r;
        }

        #endregion
    }
}
